package com.CST.mapper.cst.cb;

import com.CST.dto.cb.DateDTO;
import com.CST.dto.cb.InSourceDTO;
import com.CST.entity.cb.AllocationCoefficient;
import com.CST.entity.cb.BaseInCome;
import com.CST.vo.cb.*;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface BaseInComeMapper extends BaseMapper<BaseInCome> {
    List<AllocationCoefficient> listInComeCoefficient(DateDTO dateDTO);

    List<BaseInCome> listBaseInComeByDate(DateDTO dateDTO);

    List<InSourceVO> listInComeWithPDept(DateDTO dateDTO);

    void insertBaseInCome(@Param("list") List<InSourceVO> inSourceVOList, @Param("year") Integer year);

    boolean insertBaseInComeOne(@Param("item") BaseInCome baseInCome);

    boolean updateBaseInComeOne(@Param("item") BaseInCome baseInCome);

    boolean deleteOne(long id, int year);

    List<InSourceVO> listBaseInCome(InSourceDTO inSourceDTO);

    /**
     * 根据时间范围和父级科室查询收入数据
     * 包括开单+执行
     *
     * @param dateDTO
     * @param pDeptCode
     * @return
     */
    List<BaseInCome> listBaseInComeByDateAndPDept(@Param("dateDTO") DateDTO dateDTO, @Param("pDeptCode") String pDeptCode);

    /**
     * 科室项目收入分析报表
     * 需要时间范围+父级科室+开单or执行收入标记
     * dateDTO.unitCode = bill为开单
     * dateDTO.unitCode = exe为执行
     *
     * @param dateDTO   时间范围等其他条件
     * @param pDeptCode 父级科室编号
     * @return
     */
    List<BaseInCome> listInComeByDateAndPDeptWithFee(@Param("dateDTO") DateDTO dateDTO, @Param("pDeptCode") String pDeptCode);

    List<ReportAllBaseCostVO> listAllBaseCost(@Param("dateDTO") DateDTO dateDTO);
    List<ReportAllBaseCostVO> listAllInCome(@Param("dateDTO") DateDTO dateDTO);
    List<ReportAllBaseCostVO> listBaseCostAndInCome(@Param("dateDTO") DateDTO dateDTO);
    List<ReportAllBaseCostVO> listALLBaseCostAndInCome(@Param("dateDTO") DateDTO dateDTO);
    List<ReportAllBaseCostVO> listALLBaseCostByZDept(@Param("dateDTO") DateDTO dateDTO);
    /**
     * 根据时间+父级科室名称获取收入数据
     * 携带了开单和执行的科室类型和属性
     * 时间可传范围或年月
     * 父级科室可传Null
     */
    List<BaseInComeVO> listBaseInComeVOByDateAndPDept(@Param("dateDTO") DateDTO dateDTO, @Param("pDeptCode") String pDeptCode);

    /**
     * 根据时间+父级科室获取收入输入
     * 携带了开单和执行科室类型和属性
     * 需要根据billDept/exeDept,feeCode,feeName进行分组
     */
    List<BaseInComeVO> listBaseInComeVOByDateAndPDeptGroupWithDeptAndFee(@Param("dateDTO") DateDTO dateDTO, @Param("pDeptCode") String pDeptCode, @Param("deptCode") String deptCode, @Param("feeCode") String feeCode);

    /**
     * 传入时间+父级科室编号+收入类型（门诊，住院，非HIS）
     * 获取相应的收入数据
     */
    List<BaseInComeVO> listBaseInComeByDateAndPDeptAndType(@Param("dateDTO") DateDTO dateDTO,@Param("pDeptCode") String pDeptCode,@Param("type") Integer type);

    /**
     * base in come 查询已关联未关联科室，根据TYPE过滤门诊，住院,非HIS
     * @param inSourceDTO
     * @return
     */
    List<InComeSourceUnLinkVO> getUnlinkInComeOutSourceWithExecutive(InSourceDTO inSourceDTO);

    /**
     * base in come 查询已关联未关联，根据TYPE过滤门诊，住院，非HIS
     * @param inSourceDTO
     * @return
     */
    List<InComeSourceUnLinkVO> getUnLinkHisCodeWithExecutive(InSourceDTO inSourceDTO);

    /**
     * 删除
     * @param inSourceDTO
     */
    void deleteBaseIncome(InSourceDTO inSourceDTO);
    List<ReportInComeAnalyseVO> listInComeByDateAndPDeptWithAnalyseNew(@Param("dateDTO") DateDTO dateDTO, @Param("deptCode") String deptCode, @Param("pDeptCode") String pDeptCode);
}
